# -*- tcl -*-
# base32hex.testsuite:  tests for hex extended base32.
#
# Public domain
#
# RCS: @(#) $Id: base32hex.testsuite,v 1.1 2006/05/27 20:44:36 andreas_kupries Exp $

# -------------------------------------------------------------------------

::tcltest::testConstraint base32hex_critcl [string equal $impl critcl]

# -------------------------------------------------------------------------

test base32-hex-${impl}-1.0 {Encode, wrong#args} -body {
    ::base32::hex::encode
} -returnCodes error -result {wrong # args: should be "::base32::hex::encode bitstring"}

test base32-hex-${impl}-1.1 {Encode, wrong#args} -body {
    ::base32::hex::encode a b
} -returnCodes error -result {wrong # args: should be "::base32::hex::encode bitstring"}

# -------------------------------------------------------------------------

test base32-hex-${impl}-2.0 {Decode, wrong#args} -body {
    ::base32::hex::decode
} -returnCodes error -result {wrong # args: should be "::base32::hex::decode estring"}

test base32-hex-${impl}-2.1 {Decode, wrong#args} -body {
    ::base32::hex::decode a b
} -returnCodes error -result {wrong # args: should be "::base32::hex::decode estring"}

# -------------------------------------------------------------------------
# 0 .. 6 are the official test vectors from RFC 3548
# 7 .. 12 are the vectors I fot previous, non-conforming,
#         implementation, updated for conformance.
# 13 ..   are new vectors to cover the whole range of bytes

# 4-0              00100 000
# 4-0-16-0         00100 00000 10000 0
# 4-0-16-2-0       00100 00000 10000 00010 0000
# 4-0-16-2-0-8-0   00100 00000 10000 00010 00000 01000 00
# 4-0-16-2-0-8-1-0 00100 00000 10000 00010 00000 01000 00001 00000

foreach {n text encoded} {
    0    {}       {}
    1    f        CO======
    2    fo       CPNG====
    3    foo      CPNMU===
    4    foob     CPNMUOG=
    5    fooba    CPNMUOJ1
    6    foobar   CPNMUOJ1E8======
    -    -        -
    7    { }      40======
    8    {  }     40G0====
    9    {   }    40G20===
    10   {    }   40G2080=
    11   {     }  40G20810
    12   {      } 40G2081040======
    -  -    -         -  -    -         -  -    -         -  -    -       
    20 \000 00======  28 \010 10======  36 \020 20======  44 \030 30======
    21 \001 04======  29 \011 14======  37 \021 24======  45 \031 34======
    22 \002 08======  30 \012 18======  38 \022 28======  46 \032 38======
    23 \003 0C======  31 \013 1C======  39 \023 2C======  47 \033 3C======
    24 \004 0G======  32 \014 1G======  40 \024 2G======  48 \034 3G======
    25 \005 0K======  33 \015 1K======  41 \025 2K======  49 \035 3K======
    26 \006 0O======  34 \016 1O======  42 \026 2O======  50 \036 3O======
    27 \007 0S======  35 \017 1S======  43 \027 2S======  51 \037 3S======
    -  -    -         -  -    -         -  -    -         -  -    -       
    52 \040 40======  60 \050 50======  68 \060 60======  76 \070 70======
    53 \041 44======  61 \051 54======  69 \061 64======  77 \071 74======
    54 \042 48======  62 \052 58======  70 \062 68======  78 \072 78======
    55 \043 4C======  63 \053 5C======  71 \063 6C======  79 \073 7C======
    56 \044 4G======  64 \054 5G======  72 \064 6G======  80 \074 7G======
    57 \045 4K======  65 \055 5K======  73 \065 6K======  81 \075 7K======
    58 \046 4O======  66 \056 5O======  74 \066 6O======  82 \076 7O======
    59 \047 4S======  67 \057 5S======  75 \067 6S======  83 \077 7S======
    -  -    -         -  -    -         -  -    -         -  -    -       
    a0 \100 80======  a8 \110 90======  b6 \120 A0======  c4 \130 B0======
    a1 \101 84======  a9 \111 94======  b7 \121 A4======  c5 \131 B4======
    a2 \102 88======  b0 \112 98======  b8 \122 A8======  c6 \132 B8======
    a3 \103 8C======  b1 \113 9C======  b9 \123 AC======  c7 \133 BC======
    a4 \104 8G======  b2 \114 9G======  c0 \124 AG======  c8 \134 BG======
    a5 \105 8K======  b3 \115 9K======  c1 \125 AK======  c9 \135 BK======
    a6 \106 8O======  b4 \116 9O======  c2 \126 AO======  d0 \136 BO======
    a7 \107 8S======  b5 \117 9S======  c3 \127 AS======  d1 \137 BS======
    -  -    -         -  -    -         -  -    -         -  -    -       
    d2 \140 C0======  e0 \150 D0======  e8 \160 E0======  f6 \170 F0======
    d3 \141 C4======  e1 \151 D4======  e9 \161 E4======  f7 \171 F4======
    d4 \142 C8======  e2 \152 D8======  f0 \162 E8======  f8 \172 F8======
    d5 \143 CC======  e3 \153 DC======  f1 \163 EC======  f9 \173 FC======
    d6 \144 CG======  e4 \154 DG======  f2 \164 EG======  g0 \174 FG======
    d7 \145 CK======  e5 \155 DK======  f3 \165 EK======  g1 \175 FK======
    d8 \146 CO======  e6 \156 DO======  f4 \166 EO======  g2 \176 FO======
    d9 \147 CS======  e7 \157 DS======  f5 \167 ES======  g3 \177 FS======
    -  -    -         -  -    -         -  -    -         -  -    -       
    h0 \200 G0======  h8 \210 H0======  i6 \220 I0======  j4 \230 J0======
    h1 \201 G4======  h9 \211 H4======  i7 \221 I4======  j5 \231 J4======
    h2 \202 G8======  i0 \212 H8======  i8 \222 I8======  j6 \232 J8======
    h3 \203 GC======  i1 \213 HC======  i9 \223 IC======  j7 \233 JC======
    h4 \204 GG======  i2 \214 HG======  j0 \224 IG======  j8 \234 JG======
    h5 \205 GK======  i3 \215 HK======  j1 \225 IK======  j9 \235 JK======
    h6 \206 GO======  i4 \216 HO======  j2 \226 IO======  k0 \236 JO======
    h7 \207 GS======  i5 \217 HS======  j3 \227 IS======  k1 \237 JS======
    -  -    -         -  -    -         -  -    -         -  -    -       
    k2 \240 K0======  l0 \250 L0======  l8 \260 M0======  m6 \270 N0======
    k3 \241 K4======  l1 \251 L4======  l9 \261 M4======  m7 \271 N4======
    k4 \242 K8======  l2 \252 L8======  m0 \262 M8======  m8 \272 N8======
    k5 \243 KC======  l3 \253 LC======  m1 \263 MC======  m9 \273 NC======
    k6 \244 KG======  l4 \254 LG======  m2 \264 MG======  n0 \274 NG======
    k7 \245 KK======  l5 \255 LK======  m3 \265 MK======  n1 \275 NK======
    k8 \246 KO======  l6 \256 LO======  m4 \266 MO======  n2 \276 NO======
    k9 \247 KS======  l7 \257 LS======  m5 \267 MS======  n3 \277 NS======
    -  -    -         -  -    -         -  -    -         -  -    -       
    o0 \300 O0======  o8 \310 P0======  p6 \320 Q0======  q4 \330 R0======
    o1 \301 O4======  o9 \311 P4======  p7 \321 Q4======  q5 \331 R4======
    o2 \302 O8======  p0 \312 P8======  p8 \322 Q8======  q6 \332 R8======
    o3 \303 OC======  p1 \313 PC======  p9 \323 QC======  q7 \333 RC======
    o4 \304 OG======  p2 \314 PG======  q0 \324 QG======  q8 \334 RG======
    o5 \305 OK======  p3 \315 PK======  q1 \325 QK======  q9 \335 RK======
    o6 \306 OO======  p4 \316 PO======  q2 \326 QO======  r0 \336 RO======
    o7 \307 OS======  p5 \317 PS======  q3 \327 QS======  r1 \337 RS======
    -  -    -         -  -    -         -  -    -         -  -    -       
    r2 \340 S0======  s0 \350 T0======  s8 \360 U0======  t6 \370 V0======
    r3 \341 S4======  s1 \351 T4======  s9 \361 U4======  t7 \371 V4======
    r4 \342 S8======  s2 \352 T8======  t0 \362 U8======  t8 \372 V8======
    r5 \343 SC======  s3 \353 TC======  t1 \363 UC======  t9 \373 VC======
    r6 \344 SG======  s4 \354 TG======  t2 \364 UG======  u0 \374 VG======
    r7 \345 SK======  s5 \355 TK======  t3 \365 UK======  u1 \375 VK======
    r8 \346 SO======  s6 \356 TO======  t4 \366 UO======  u2 \376 VO======
    r9 \347 SS======  s7 \357 TS======  t5 \367 US======  u3 \377 VS======
} {
    if {$n == "-"} continue
    test base32-hex-${impl}-3.$n "Encode \"$text\"" -body {
	::base32::hex::encode $text
    } -result $encoded ; # {}

    test base32-hex-${impl}-4.$n "Decode \"$encoded\"" -body {
	::base32::hex::decode $encoded
    } -result $text ; # {}
}

# -------------------------------------------------------------------------
# Decoder stress testing bad input

foreach {n input message} {
    0 abcdeZaa {Invalid character at index 5: "Z"}
    1 A         {Length is not a multiple of 8}
    2 ABCDEFG   {Length is not a multiple of 8}
    3 A=======  {Invalid padding of length 7}
    4 ACA=====  {Invalid padding of length 5}
    5 A=CA====  {Invalid character at index 1: "=" (padding found in the middle of the input)}
} {
    test base32-hex-${impl}-5.$n "Decode, bad input \"$input\"" -body {
	::base32::hex::decode $input
    } -returnCodes error -result $message ; # {}
}
